package com.kaesar.thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class FutureCook {

  public static void main(String[] args) throws InterruptedException, ExecutionException {
    long startTime = System.currentTimeMillis();
    // 第一步，网购厨具
    Callable<Chujv> onlineShopping = new Callable<Chujv>() {
      @Override
      public Chujv call() throws Exception {
        System.out.println("第一步：下单");
        System.out.println("第一步：等待送货");
        Thread.sleep(5000); // 模拟送货时间
        System.out.println("第一步：快递送到");
        return new Chujv();
      }
    };

    FutureTask<Chujv> task = new FutureTask<>(onlineShopping);
    new Thread(task).start();
    // 第二步，去超市购买食材
    Thread.sleep(2000); // 模拟购买食材时间
    Shicai shicai = new Shicai();
    System.out.println("第二步：食材到位");

    // 第三步，用厨具烹饪食材
    if (!task.isDone()) { // 练习快递员，询问是否到货
      System.out.println("第三步：厨具还没到，心情好就等着（心情不好就调用 cancel 方法取消订单）");
    }
    System.out.println("get 之前"); // 在 task 执行完之前就可以执行
    Chujv chujv = task.get();
    System.out.println("get 之后"); // 在 task 执行完之后才会执行到这里
    System.out.println("第三步：厨具到位，开始展现厨艺");
    cook(chujv, shicai);

    System.out.println("总共用时：" + (System.currentTimeMillis() - startTime) + "ms");
  }

  // 用厨具烹饪食材
  static void cook(Chujv chujv, Shicai shicai) {

  }

  // 厨具类
  static class Chujv {

  }


  // 食材类
  static class Shicai {

  }
}
